﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//main75：指针操作数组*p数组取值
int main75()
{
	//1.数组名arr是数组的首地址，这是一个常量； 
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("2.输出数组名arr的首地址：%p\n", arr);//00BAF85C
	printf("3.输出数组arr[0]的首地址：%p\n", arr);//00BAF85C

	//4.下面等同于p=arr，【数据类型 *】 变量名；指向数组的指针p，当操作指针时，间接操作了数组；
	int* p = arr;
	for (int i = 0; i < 10; i++)
	{
		printf("5.输出数组arr的元素arr[i]和指针变量p[i]的值：%d %d\n", arr[i], p[i]);//1 1 ... 10 10
		//7.和上次一样，*(p+1)，内存加了1个int变量的空间，即32位中4个字节；sizeof(int)*n
		printf("6.使用指针变量p来指向数组，输出*p的数组取值：%d\n", *(p + i));//1 ... 10
	}
	printf("---------------------------------------------------------------------\n");

	//8.指针的降级操作；
	*p = 100;//arr[0]
	*(p + 1) = 200;//arr[1]
	p[5] = 300;//arr[5]

	p++;
	*p = 400;//arr[1]	p[0]
	p[2] = 300;//arr[3]	p[2]
	arr[2] = 500;//p[1]

	//12.数组下标越界异常；
	//p[10] = 300;
	//p -= 3;
	//*p = 100;

	for (int i = 0; i < 10; i++)
	{
		//10.由于p++，导致指针p的指向出现问题，此时p[0]实际上是arr[1]，而p[9]为arr[10],没有下标为10的数组元素，就会数组下标越界；
		printf("9.输出指针p改变arr数组的值，此时arr为：%d\n", *(p + i));// 400 500 300 5 300 7 8 9 10 -858993460
		printf("11.输出数组arr的元素，用arr[i]表示：%d\n", arr[i]);//100 400 500 300 5 300 7 8 9 10
	}

	system("pause");
	return EXIT_SUCCESS;
}